<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // ES变量有两种不同类型的数据 ： 原始值  和 引用值 
        // 也就是基本数据类型（简单） 和  引用数据类型（复杂）

        // 面试题
        /* ==================== 背下来 ===================== */
        // Q1: ==> 数据类型有哪些？
        // 基本数据类型：Number String Boolean / undefined null / Symbol BigInt 
        // 引用类型：Object ==>  Function Array Date Math RegExp

        // Q2: ==> 基本数据类型 和 引用数据类型 在 内存是怎么存储的？
        // 栈（Stack）: 基本数据类型的值，存在栈里面的
        // 堆（Heap）: 引用类型的数据，栈里面存放的是地址，这个地址指向堆中的数据。
        /* ====================  ===================== */

        // 栈 后进先出的特点 ( Last In First Out ) 最后放进去的小圆圈，可以最先拿出来


        // 1. 基本数据类型 不可以添加属性和方法
        let str = '123'
        str.a = '222'
        str.max = function(){console.log(666)}
        console.log(str)
        console.log(str.a)
        console.log(str.max)

        // 赋值
        // 2. 基本数据类型是按值访问的。也就是说：我们操作的是存储在变量中的实际值
        let a = 1 
        let b = 2 
        a = b // 赋值 ， 把b的值，赋值给a。
        a = 3 
        b = 4
        console.log(a, b)

        // 3. 引用类型，直接赋值，实际上是复制的地址（指针） 重点
        let obj1 = {name:'wa~', age:18}
        let obj2 = obj1 // 赋值（引用类型，是赋址）

        obj2.name = '大家饿了吗'

        console.log(obj1)
        // 赋值之后，obj1  和 obj2 两个变量都指向了同一个对象，他们相互影响
    </script>
</body>
</html>